package q227_calculate;

import java.util.Deque;
import java.util.LinkedList;

public class Solution {
    public static void main(String[] args) {
        //初始时间
        long startTime = System.currentTimeMillis();

        /*要计算的程序部分*/
        for (int i = 0; i < Integer.MAX_VALUE; ++i) {
            for (int j = 0; j < Integer.MAX_VALUE; ++j) {
                int c = 0;
            }
        }
        System.out.println("AA");
        //结束时间
        long endTime = System.currentTimeMillis();
        //打印
        System.out.println("程序运行时间：" + (endTime - startTime) + "ms");
    }
    /*
    相较于224的计算器 此题最大的不同在于：
    同样使用栈结构来帮助判断先后计算顺序
    224由于具有括号 并且 没有乘除 因此只需按照括号的状况压入 正负符号 即可
    而此题由于乘除会影响计算顺序 因此必须按乘除状况 压入 数字
     */
    public int calculate(String s) {
        int ans = 0;
        // 首先设定预备符为+
        char preSin = '+';

        int tempNum = 0;
        Deque<Integer> stack = new LinkedList<>();

        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                tempNum = tempNum * 10 + s.charAt(i) - '0';
            }

            // 这里需要注意的是 我们每次遇到加减乘除符号时
            // 实际上是根据上一个压入栈中的符号进行计算
            // 而不是当前读取到的符号
            // 例如 a + b * c
            // 当我们读取到 * 时，实际上此时从栈中取出的是上一个符号 +
            // 也就是根据 + 我们将b压入栈中 而到最后一个数字时
            // 我们才会读取到 * 此时将栈中最后一个数弹出并替换
            // 最后栈中的所有数字之和也就是答案
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == s.length() - 1) {
                switch (preSin) {
                    case '+' :
                        stack.push(tempNum);
                        break;
                    case '-' :
                        stack.push(-tempNum);
                        break;
                    case '*' :
                        stack.push(stack.pop() * tempNum);
                        break;
                    case '/' :
                        stack.push(stack.pop() / tempNum);
                }
                // 注意清除tempNum
                tempNum = 0;
                // 并且更换preSin为当前字符
                preSin = s.charAt(i);
            }
        }

        while (!stack.isEmpty()) {
            ans += stack.pop();
        }
        return ans;
    }
}
